package InterfaceTexto;

import java.util.ArrayList;
import java.util.Scanner;

import Facade.FachadaDeNegocio;
import HereClass.TransformaString;

public class MinhaInterface {

	private FachadaDeNegocio fachadaDeNegocio = FachadaDeNegocio.getInstance();
	private String id;


	public void menuPrincipal() {
		Scanner sc = new Scanner(System.in);
		System.out.println("Bem vindo ao I'm Here");
		System.out.println("..:: Menu Principal ::..");
		System.out.println("1. Logar");
		System.out.println("2. Cadastrar");
		System.out.println("3. Sair");
		System.out.print("Opcao: ");
		String opcao = sc.nextLine();
		int opcaoInt = TransformaString.toInt(opcao);
		switch (opcaoInt) {
		case 1:
			this.logar();
		case 2:
			this.cadastrar();
			break;
		case 3:
			this.sair();
		default:
			System.out.println("\nOpcao Invalida\n");
			menuPrincipal();
		}
	}

	private void logar() {
		String userName, senha, ip;
		Scanner sc = new Scanner(System.in);
		System.out.println("\n * Fazer login * \n");
		System.out.print("Digite seu UserName: ");
		userName = sc.nextLine();
		System.out.print("Digite sua senha: ");
		senha = sc.nextLine();
		System.out.print("Digite seu IP: ");
		ip = sc.nextLine();

		try {
			this.id = String.valueOf(fachadaDeNegocio.login(userName, senha, ip));
			this.logado();
		} catch (Exception e) {
			System.out.println(e.getMessage() + "\n");
			this.menuPrincipal();
		}

	}

	public void cadastrar() {
		Scanner sc = new Scanner(System.in);
		String nome, telefone, email, userName, senha, ip;
		System.out.println("\n * Cadastramento de Usuario * \n");
		System.out.print("Informe seu nome: ");
		nome = sc.nextLine();
		System.out.print("Informe seu telefone: ");
		telefone = sc.nextLine();
		System.out.print("Informe seu email: ");
		email = sc.nextLine();
		System.out.print("Informe seu userName: ");
		userName = sc.nextLine();
		System.out.print("Informe sua senha: ");
		senha = sc.nextLine();
		System.out.print("Informe seu ip: ");
		ip = sc.nextLine();

		try {
			this.id = String.valueOf(fachadaDeNegocio.cadastrarUsuario(userName, nome, email, senha, telefone, ip));
			this.logado();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			this.menuPrincipal();
		}

	}

	public void logado() throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println("\n * Voce esta conectado * \n");
		System.out.println("O que voce deseja fazer?");
		System.out.print("1. Gerenciar amigos\n" + "2. Convites pendentes\n"
				+ "3. Email\n" + "4. SMS\n" + "5. Chat\n"
				+ "6. Atualizar meu cadastro\n" + "7. Sair\n\n"
				+ "Digite a opcao desejada: ");

		String opcao = sc.nextLine();
		int opcaoInt = TransformaString.toInt(opcao);
		switch (opcaoInt) {
		case 1:
			this.gerenciarAmigos();
			break;
		case 2:
			this.convitesPendentes();
			break;
		case 3:
			this.email();
			break;
		case 4:
			this.sms();
			break;
		case 5:
			this.chat();
			break;
		case 6:
			this.alterarDados();
			break;
		case 7:
			this.desconectar();
			this.menuPrincipal();
			System.out.println();
			break;
		default:
			System.out.println("\nOpcao Invalida\n");
			logado();
		}
	}

	private void convitesPendentes() throws Exception {
		System.out.println("\n  --  CONVITES PENDENTES  -- \n");
		ArrayList<String> convites = null;
		
		try{
			convites = this.fachadaDeNegocio.getConvitesPendentes(id);
		}catch(Exception e){
			this.logado();
		}
		if(convites.size() == 0) {
			System.out.println("\n Voce nao possui nenhum convite pendente\n");
			this.logado();
		}
		Scanner sc = new Scanner(System.in);
		int i;
		for(i = 0; i < convites.size(); i++) {
			System.out.println("\n Convites pendentes("
					+ convites.size() + ")\n");
			System.out.println(convites.get(i) + " quer ser seu amigo.\n"
					+ "Digite a opcao:\n"
					+ "\n    1 - Aceitar convite"
					+ "\n    2 - Rejeitar convite"
					+ "\n    3 - Voltar\n");
			String opcao = sc.nextLine();
			int opcaoInt = TransformaString.toInt(opcao);
			switch (opcaoInt) {
			case 1 : 
				while (true) {
					System.out.println("\n Digite a opcao:\n"
							+ "\n     1 - Desejo ficar oculto para este contato"
							+ "\n     2 - Desejo ficar visivel\n");
					opcao = sc.nextLine();
					int modo = TransformaString.toInt(opcao);
					if(opcaoInt == 1 || opcaoInt == 2) {
						this.fachadaDeNegocio.confirmarCompartilhamento(TransformaString.toInt(id),
								convites.get(i), modo);
						this.fachadaDeNegocio.removeConvite(id, convites.get(i));
						System.out.println("\n" + convites.get(i)
												+ " agora eh seu amigo\n");
						convites.remove(i);
						break;
					}
					System.out.println("\n OPCAO INVALIDA!!!  TENTE NOVAMENTE \n");
				}
				break;
			case 2 :
				if (this.fachadaDeNegocio.removeConvite(id, convites.get(i)))
					System.out.println("\n O convite enviado por " + 
										convites.get(i) + 
										" foi rejeitado \n");
				convites.remove(i);
				break;
			case 3 :
				this.logado();
				break;
			default :
				System.out.println("\n OPCAO INVALIDA!!!  TENTE NOVAMENTE\n");
				this.convitesPendentes();
			}
			
		}
		this.convitesPendentes();
	}

	private void chat() {
		// TODO Auto-generated method stub

	}
	
	private void email() throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println("\n * Opcoes de EMAIL * \n");
		System.out.print("1. Enviar Email\n" + "2. Voltar\n"
				+ "Digite a opcao desejada: ");

		int opcao = sc.nextInt();
		switch (opcao) {
		case 1:
			this.enviarEmail();
		case 2:
			this.logado();
		default:
			System.out.println("Opcao invalida!\n");
			sms();
		}
	}

	
	private void enviarEmail() throws Exception {
		
		System.out.println("\nLista de amigos:\n");
		System.out.println(fachadaDeNegocio.getAmigos(this.id));
		Scanner sc = new Scanner(System.in);
		String para, assunto, mensagem;
		System.out.println("\nENVIAR EMAIL\n\n");
		System.out.print("\nPara(userName): ");
		para = sc.nextLine();
		System.out.print("Assunto: ");
		assunto = sc.nextLine();
		System.out.print("Mensagem: ");
		mensagem = sc.nextLine();
		try {
			fachadaDeNegocio.initMensageiro("email");
			System.out.println(fachadaDeNegocio.enviarEmail(id, para, assunto, mensagem)
					+ "\n\n");
		} catch (Exception e) {
			e.getMessage();
		}
		email();

	}

	private void desconectar() {
		try {
			fachadaDeNegocio.logout(id);
		} catch (Exception e) {

		}
	}

	private void sms() throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println("\n * Opcoes de SMS * \n");
		System.out.print("1. Enviar SMS\n" + "2. Voltar\n"
				+ "Digite a opcao desejada: ");

		int opcao = sc.nextInt();
		switch (opcao) {
		case 1:
			this.enviarSMS();
		case 2:
			this.logado();
		default:
			System.out.println("Opcao invalida!\n");
			sms();
		}
	}

	private void enviarSMS() throws Exception {
		Scanner sc = new Scanner(System.in);
		String numero, mensagem;
		System.out.println("\n * Dados do SMS *\n");
		System.out.print("Digite o numero: ");
		numero = sc.nextLine();
		System.out.print("Digite a mensagem: ");
		mensagem = sc.nextLine();

		try {
			fachadaDeNegocio.initMensageiro("sms");
			System.out.println(fachadaDeNegocio.enviarSMS(id, numero, mensagem) + "\n");
			this.sms();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			this.sms();
		}
	}

	private void alterarDados() throws Exception {
		Scanner sc = new Scanner(System.in);
		String atributo = "", valor = "";
		System.out.println("\n * Atualizacao de Cadastro * \n");

		System.out.print("1. Alterar meu nome\n" + "2. Alterar meu telefone\n"
				+ "3. Alterar meu email\n" + "4. Alterar minha senha\n"
				+ "5. Voltar\n\n" + "Digite a opcao desejada: ");

		String opcao = sc.nextLine();
		int opcaoInt = TransformaString.toInt(opcao);
		switch (opcaoInt) {
		case 1:
			System.out.print("Digite o novo nome: ");
			valor = sc.next();
			atributo = "nome";
			break;
		case 2:
			System.out.print("Digite o novo telefone: ");
			valor = sc.next();
			atributo = "telefone";
			break;
		case 3:
			System.out.print("Digite o novo email: ");
			valor = sc.next();
			atributo = "email";
			break;
		case 4:
			System.out.print("Digite a nova senha: ");
			valor = sc.next();
			atributo = "senha";
			break;
		case 5:
			this.logado();
		default:
			System.out.println("\nOpcao Invalida\n");
			this.alterarDados();
		}

		try {
			fachadaDeNegocio.atualizarUsuario(
						fachadaDeNegocio.getUserName(id), atributo, valor);
			System.out.println("\n* Seus dados foram alterados com sucesso! *");
			this.logado();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			this.logado();
		}

	}

	private void gerenciarAmigos() throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println("\n * Gerenciador de Amigos * \n");
		System.out
				.println("1. Lista de Amigos \n2. Localizacao de um Amigo \n"
						+ "3. Mudar Visibilidade \n4. Convidar um Amigo \n5. Remover Amigo \n"
						+ "6. Voltar");
		System.out.print("Informe sua opcao: ");
		String opcao = sc.nextLine();
		int opcaoInt = TransformaString.toInt(opcao);
		switch (opcaoInt) {
		case 1:
			System.out.println("\nLista atual de amigos:\n");
			String listaDeAmigos = fachadaDeNegocio.getAmigos(this.id);
			if (listaDeAmigos.length() == 2) {
				System.out.println("\n>>> Voce ainda nao possui amigos!\n");
				gerenciarAmigos();
			}
			else {
				System.out.println(listaDeAmigos);
				gerenciarAmigos();
			}
			break;
		case 2:
			this.localizacaoAmigo();
			break;
		case 3:
			this.mudarVisibilidade();
			break;
		case 4:
			this.convidarAmigo();
			break;
		case 5:
			this.removerAmigo();
			break;
		case 6:
			this.logado();
			break;
		default:
			System.out.println("\nOpcao Invalida\n");
			this.gerenciarAmigos();
		}
	}

	private void removerAmigo() throws Exception {
		System.out.println("\nLista de amigos:\n");
		System.out.println(fachadaDeNegocio.getAmigos(this.id));
		Scanner sc = new Scanner(System.in);
		System.out.print("Informe o userName do seu amigo: ");
		String userName = sc.nextLine();
		try {
			fachadaDeNegocio.removerAmigo(id, userName);
			this.gerenciarAmigos();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			this.gerenciarAmigos();
		}
	}

	private void convidarAmigo() throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.print("Informe o email do seu amigo: ");
		String email = sc.nextLine();
		try {
			fachadaDeNegocio.setDiretorioGabaritos("gabaritos");
			fachadaDeNegocio.initMensageiro("email");
			String msg = fachadaDeNegocio.enviarConvite(id, email)+"\n";
			System.out.println(msg);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		this.gerenciarAmigos();

	}

	private void mudarVisibilidade() throws Exception {
		System.out.println("\nLista de amigos:\n");
		System.out.println(fachadaDeNegocio.getAmigos(this.id));
		Scanner sc = new Scanner(System.in);
		System.out.print("Informe o userName do seu amigo: ");
		String userName = sc.nextLine();
		System.out.print("1. Ocultar \n2. Exibir \nDigite sua op��o: ");
		int modo = sc.nextInt();
		if (modo != 1 && modo != 2) {
			System.out.println("Op��o Inv�lida");
			this.mudarVisibilidade();
		}
		try {
			fachadaDeNegocio.setCompartilhamento(id, userName, modo);
			System.out.println("Visibilidade alterada!");
			this.logado();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			this.gerenciarAmigos();
		}
	}

	private void localizacaoAmigo() throws Exception {
		System.out.println("\nLista de amigos:\n");
		System.out.println(fachadaDeNegocio.getAmigos(this.id));
		Scanner sc = new Scanner(System.in);
		System.out.println("Informe o userName do seu amigo: ");
		String userName = sc.nextLine();

		try {
			fachadaDeNegocio.obterLocalizacao(userName);
			gerenciarAmigos();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			this.gerenciarAmigos();
		}

	}

	public void sair() {
		System.out.println("\nObrigado por usar o I'm Here ;D");
		System.exit(0);
	}

}
